home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Collection of Tools & Utilities
/
Collection of Tools and Utilities.iso
/
pascal
/
totsrc11.zip
/
TOTSTR.PAS
< prev
next >
Wrap
Pascal/Delphi Source File
|
1993-05-04
|
22KB
|
906 lines
{ Copyright 1991 TechnoJock Software, Inc. }
{ All Rights Reserved }
{ Restricted by License }
{ Build # 1.10 }
Unit totSTR;
{$I TOTFLAGS.INC}
{
Development Notes: 1.00a 6/11/91 Corrected RealSciStr for 0.0
1.00b 2/03/92 Further corrections to RealToSciStr
and ValidInt
1.00c 2/27/92 Remove double negative from RealtoSciStr
1.00d 3/09/92 Changed NthNumber routine
}
INTERFACE
Uses totREAL, totINPUT;
CONST
MaxFixlength = 5;
TYPE
tJust = (JustLeft,JustCenter,JustRight);
tCase = (Lower,Upper,Proper,Leave);
tSign = (plusminus, minus, brackets, dbcr);
pFmtNumberOBJ = ^FmtNumberOBJ;
FmtNumberOBJ = object
vPrefix: string[Maxfixlength];
vSuffix: string[Maxfixlength];
vSign: tSign;
vPad: char;
vThousandsSep: char;
vDecimalSep: char;
vJustification: tJust;
{...methods}
constructor Init;
procedure SetPrefixSuffix(P,S:string);
procedure SetSign(S:tSign);
procedure SetSeparators(P,T,D:char);
procedure SetJustification(J:tJust);
function GetDecimal:char;
function FormattedStr(StrVal:string; Width:byte):string;
function FormattedLong(Val:longint; Width:byte):string;
function FormattedReal(Val:extended; DP:byte; Width:byte):string;
destructor Done;
end; {FmtNumberOBJ}
CONST
Floating = 255;
Fmtchars: set of char = ['!','#','@','*'];
function PicFormat(Input,Picture:string;Pad:char): string;
function TruncFormat(Input:string;Start,Len:byte; Pad:char):string;
function Squeeze(L:char;Str:string;Width:byte): string;
function First_Capital_Pos(Str:string): byte;
function First_Capital(Str:string): char;
function Pad(PadJust:tJust;Str:string;Size:byte;ChPad:char):string;
function PadLeft(Str:string;Size:byte;ChPad:char):string;
function PadCenter(Str:string;Size:byte;ChPad:char):string;
function PadRight(Str:string;Size:byte;ChPad:char):string;
function Last(N:byte;Str:string):string;
function First(N:byte;Str:string):string;
function AdjCase(NewCase:tCase;Str:string):string;
function SetUpper(Str:string):string;
function SetLower(Str:string):string;
function SetProper(Str:string):string;
function OverType(N:byte;StrS,StrT:string):string;
function Strip(L,C:char;Str:string):string;
function LastPos(C:char;Str:string):byte;
function PosAfter(C:char;Str:string;Start:byte):byte;
function LastPosBefore(C:char;Str:string;Last:byte):byte;
function PosWord(Wordno:byte;Str:string):byte;
function WordCnt(Str:string):byte;
function ExtractWords(StartWord,NoWords:byte;Str:string):string;
function ValidInt(Str:string):boolean;
function ValidHEXInt(Str:string):boolean;
function ValidReal(Str:string):boolean;
function StrToInt(Str:string):integer;
function StrToLong(Str:string):Longint;
function HEXStrToLong(Str:string):longint;
function StrToReal(Str:string):extended;
function RealToStr(Number:extended;Decimals:byte):string;
function IntToStr(Number:longint):string;
function IntToHEXStr(Number:longint):string;
function Decimals (L:byte):byte;
function RealToSciStr(Number:extended; D:byte):string;
function NthNumber(InStr:string;Nth:byte) : char;
IMPLEMENTATION
function PicFormat(Input,Picture:string;Pad:char): string;
{}
var
TempStr : string;
I,J : byte;
begin
J := 0;
For I := 1 to length(Picture) do
begin
If not (Picture[I] in Fmtchars) then
begin
TempStr[I] := Picture[I] ; {force any none format charcters into string}
inc(J);
end
else {format character}
begin
If I - J <= length(Input) then
TempStr[I] := Input[I - J]
else
TempStr[I] := Pad;
end;
end;
TempStr[0] := char(length(Picture)); {set initial byte to string length}
PicFormat := Tempstr;
end; {PicFormat}
function TruncFormat(Input:string;Start,Len:byte; Pad:char):string;
{}
var
L : byte;
begin
if Start > 1 then
Delete(Input,1,pred(Start));
L := length(Input);
if L = Len then
TruncFormat := Input
else if L > Len then
TruncFormat := copy(Input,1,Len)
else
TruncFormat := Padleft(Input,Len,Pad);
end; {TruncFormat}
function Squeeze(L:char; Str:string;Width:byte): string;
{}
const more:string[1] = #26;
var temp : string;
begin
if Width = 0 then
begin
Squeeze := '';
exit;
end;
Fillchar(Temp[1],Width,' ');
Temp[0] := chr(Width);
if Length(Str) < Width then
move(Str[1],Temp[1],length(Str))
else
begin
if upcase(L) = 'L' then
begin
move(Str[1],Temp[1],pred(width));
move(More[1],Temp[Width],1);
end
else
begin
move(More[1],Temp[1],1);
move(Str[length(Str)-width+2],Temp[2],pred(width));
end;
end;
Squeeze := Temp;
end; {Squeeze}
function First_Capital_Pos(Str : string): byte;
{}
var StrPos : byte;
begin
StrPos := 1;
while (StrPos <= length(Str)) and (AlphabetTOT^.IsUpper(ord(Str[StrPos])) = false) do
StrPos := Succ(StrPos);
if StrPos > length(Str) then
First_Capital_Pos := 0
else
First_Capital_Pos := StrPos;
end; {First_Capital_Pos}
function First_capital(Str : string): char;
{}
var B : byte;
begin
B := First_Capital_Pos(Str);
if B > 0 then
First_Capital := Str[B]
else
First_Capital := #0;
end; {First_capital}
function Pad(PadJust:tJust;Str:string;Size:byte;ChPad:char):string;
{}
begin
case PadJust of
JustLeft: Pad := PadLeft(Str,Size,ChPad);
JustCenter:Pad := PadCenter(Str,Size,ChPad);
JustRight: Pad := PadRight(Str,Size,ChPad);
end; {case}
end; {Pad}
function PadLeft(Str:string;Size:byte;ChPad:char):string;
var temp : string;
begin
fillchar(Temp[1],Size,ChPad);
Temp[0] := chr(Size);
if Length(Str) <= Size then
move(Str[1],Temp[1],length(Str))
else
move(Str[1],Temp[1],size);
PadLeft := Temp;
end;
function PadCenter(Str:string;Size:byte;ChPad:char):string;
var temp : string;
L : byte;
begin
fillchar(Temp[1],Size,ChPad);
Temp[0] := chr(Size);
L := length(Str);
if L <= Size then
move(Str[1],Temp[((Size - L) div 2) + 1],L)
else
Temp := copy(Str,1,L);
PadCenter := temp;
end; {center}
function PadRight(Str:string;Size:byte;ChPad:char):string;
var
temp : string;
L : integer;
begin
fillchar(Temp[1],Size,ChPad);
Temp[0] := chr(Size);
L := length(Str);
if L <= Size then
move(Str[1],Temp[succ(Size - L)],L)
else
move(Str[1],Temp[1],size);
PadRight := Temp;
end;
function Last(N:byte;Str:string):string;
var Temp : string;
begin
if N > length(Str) then
Temp := Str
else
Temp := copy(Str,succ(length(Str) - N),N);
Last := Temp;
end; {Last}
function First(N:byte;Str:string):string;
var Temp : string;
begin
if N > length(Str) then
Temp := Str
else
Temp := copy(Str,1,N);
First := Temp;
end; {First}
function AdjCase(NewCase:tCase;Str:string):string;
{}
begin
case Newcase of
Upper: Str := SetUpper(Str);
Lower: Str := SetLower(Str);
Proper: Str := SetProper(Str);
Leave:{do nothing};
end;
AdjCase := Str;
end; {AdjCase}
function SetUpper(Str:string):string;
var
I : integer;
begin
for I := 1 to length(Str) do
Str[I] := AlphabetTOT^.GetUpcase(Str[I]);
SetUpper := Str;
end; {Upper}
function SetLower(Str:string):string;
var
I : integer;
begin
for I := 1 to length(Str) do
Str[I] := AlphabetTOT^.GetLocase(Str[I]);
SetLower := Str;
end; {Lower}
function SetProper(Str:string):string;
var
I : integer;
SpaceBefore: boolean;
begin
SpaceBefore :